package com.kx.base.util;

import com.alibaba.fastjson.JSONObject;
import com.kx.base.vo.UserVO;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;

/**
 * 解决token签发与token认证的问题
 *
 * @Author Sun
 * @Date 2021/7/17 11:41
 */
public class JWTUtil {

    /**
     * token签发的有效期
     */
    public static final int TOKEN_EXPIRE = 1000 * 60 * 30;

    /**
     * token加密的算法的盐
     */
    public static final String TOKEN_KEY = "qianfeng";

    /**
     * 生成一个Token
     */
    public static String generatorToken(String nickname, UserVO user) {
        //创建一个token
        String token = Jwts.builder()
                //设置昵称
                .setSubject(nickname)
                //设置开始时间
                .setIssuedAt(new Date())
                //设置过期时间
                .setExpiration(new Date(System.currentTimeMillis() + TOKEN_EXPIRE))
                //设置携带的对象
                .claim("user", JSONObject.toJSONString(user))
                //设置签名，加密算法
                .signWith(SignatureAlgorithm.HS256, TOKEN_KEY)
                .compact();
        return token;
    }

    /**
     * 解析token
     */
    public static UserVO checkToken(String token){
        Claims body = Jwts.parser()
                //设置解密的密匙
                .setSigningKey(TOKEN_KEY)
                //解析token
                .parseClaimsJws(token)
                //获取token中携带的对象
                .getBody();
        String json = (String) body.get("user");
        UserVO user = JSONObject.parseObject(json, UserVO.class);
        return user;
    }
}
